package com.heima.search.service.impl;

import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.search.dto.HistorySearchDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.search.pojos.ApUserSearch;
import com.heima.search.service.ApUserSearchService;
import com.heima.utils.thread.AppThreadLocalUtil;
import com.mongodb.client.result.DeleteResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

@Slf4j
@Service
public class ApUserSearchServiceImpl implements ApUserSearchService {
    /**
     * 类成员变量：
     *
     * @Autowired：自动注入MongoTemplate，用于操作MongoDB数据库。
     * insert方法：
     *
     * 方法注释：这个方法用于保存用户搜索历史记录。
     * 方法参数：String keyword，用户搜索的关键词；Integer userId，用户ID。
     * 方法返回：void，无返回值。
     * @Async：Spring注解，表明这个方法是异步执行的。
     * 方法实现：
     *
     * 首先，使用MongoTemplate的findOne方法查询当前用户的搜索关键词记录。
     * 如果记录存在，更新创建时间，并使用MongoTemplate的save方法保存更新后的记录，然后返回。
     * 如果记录不存在，创建一个新的ApUserSearch对象，设置用户ID、关键词和创建时间。
     * 使用MongoTemplate的find方法查询当前用户的所有搜索历史记录，并按创建时间降序排序。
     * 如果搜索历史记录列表为空或大小小于10，直接使用MongoTemplate的save方法保存新的搜索记录。
     * 如果搜索历史记录列表大小达到或超过10，使用MongoTemplate的findAndReplace方法替换掉最旧的记录。
     *
     */
    @Autowired
    private MongoTemplate mongoTemplate;
    @Override
    @Async
    public void insert(String keyword, Integer userId) {
        //查询当前用户的搜索关键词记录
        ApUserSearch apUserSearch = mongoTemplate.findOne(
                Query.query(Criteria.where("userId").is(userId).and("keyword").is(keyword)),
                ApUserSearch.class);
        //如果记录存在，更新创建时间
        if(apUserSearch!=null){
            apUserSearch.setCreatedTime(new Date());
            mongoTemplate.save(apUserSearch);
            return;
        }
        //如果记录不存在，创建一个新的ApUserSearch对象
        apUserSearch=new ApUserSearch();
        apUserSearch.setUserId(userId);
        apUserSearch.setKeyword(keyword);
        apUserSearch.setCreatedTime(new Date());
        //判断是否超过10条记录
        //首先查询出所有的历史记录，按创建时间降序排序
        Query query=Query.query(Criteria.where("userId").is(userId));
        query.with(Sort.by(Sort.Direction.DESC,"createdTime"));
        List<ApUserSearch> apUserSearchList = mongoTemplate.find(query, ApUserSearch.class);
        //然后判断列表是否为空，或者列表大小是否大于等于10
        if(apUserSearchList==null || apUserSearchList.size()<10){
            //如果没有超过10条记录，则直接使用MongoTemplate的save方法保存新的搜索记录
            mongoTemplate.save(apUserSearch);
        }else{
            //如果超过10条记录，则使用MongoTemplate的findAndReplace方法替换掉最旧的记录
            ApUserSearch lastUserSearch = apUserSearchList.get(apUserSearchList.size() - 1);
            mongoTemplate.findAndReplace(Query.query(Criteria.where("id").is(lastUserSearch.getId())), apUserSearch);
        }
    }

    @Override
    public ResponseResult load() {
        //查询当前用户
        ApUser user = AppThreadLocalUtil.getUser();
        if (user==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN, "用户未登录");
        }
        //按照时间顺序倒序排列
        List<ApUserSearch> apUserSearchList = mongoTemplate.find(Query.query(Criteria.where("userId").is(user.getId()))
                .with(Sort.by(Sort.Direction.DESC, "createdTime")), ApUserSearch.class);
        return ResponseResult.okResult(apUserSearchList);
    }

    @Override
    public ResponseResult del(HistorySearchDto historySearchDto) {
        //检查参数
        if(historySearchDto.getId()==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        //查询当前用户
        ApUser user = AppThreadLocalUtil.getUser();
        if (user==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN, "用户未登录");
        }
        mongoTemplate.remove(Query.query(Criteria.where("userId").is(user.getId()).and("id").is(historySearchDto.getId())), ApUserSearch.class);
        return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
    }
}
